home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Resources / Chat & Communication / Digsby build 37 / digsby_setup.exe / lib / popen2.pyo (.txt) < prev    next >
Python Compiled Bytecode  |  2008-10-13  |  6KB  |  232 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.5)
  3.  
  4. import os
  5. import sys
  6. __all__ = [
  7.     'popen2',
  8.     'popen3',
  9.     'popen4']
  10.  
  11. try:
  12.     MAXFD = os.sysconf('SC_OPEN_MAX')
  13. except (AttributeError, ValueError):
  14.     MAXFD = 256
  15.  
  16. _active = []
  17.  
  18. def _cleanup():
  19.     for inst in _active[:]:
  20.         if inst.poll(_deadstate = sys.maxint) >= 0:
  21.             
  22.             try:
  23.                 _active.remove(inst)
  24.             except ValueError:
  25.                 pass
  26.             except:
  27.                 None<EXCEPTION MATCH>ValueError
  28.             
  29.  
  30.         None<EXCEPTION MATCH>ValueError
  31.     
  32.  
  33.  
  34. class Popen3:
  35.     sts = -1
  36.     
  37.     def __init__(self, cmd, capturestderr = False, bufsize = -1):
  38.         _cleanup()
  39.         self.cmd = cmd
  40.         (p2cread, p2cwrite) = os.pipe()
  41.         (c2pread, c2pwrite) = os.pipe()
  42.         if capturestderr:
  43.             (errout, errin) = os.pipe()
  44.         
  45.         self.pid = os.fork()
  46.         if self.pid == 0:
  47.             os.dup2(p2cread, 0)
  48.             os.dup2(c2pwrite, 1)
  49.             if capturestderr:
  50.                 os.dup2(errin, 2)
  51.             
  52.             self._run_child(cmd)
  53.         
  54.         os.close(p2cread)
  55.         self.tochild = os.fdopen(p2cwrite, 'w', bufsize)
  56.         os.close(c2pwrite)
  57.         self.fromchild = os.fdopen(c2pread, 'r', bufsize)
  58.         if capturestderr:
  59.             os.close(errin)
  60.             self.childerr = os.fdopen(errout, 'r', bufsize)
  61.         else:
  62.             self.childerr = None
  63.  
  64.     
  65.     def __del__(self):
  66.         self.poll(_deadstate = sys.maxint)
  67.         if self.sts < 0:
  68.             if _active is not None:
  69.                 _active.append(self)
  70.             
  71.         
  72.  
  73.     
  74.     def _run_child(self, cmd):
  75.         if isinstance(cmd, basestring):
  76.             cmd = [
  77.                 '/bin/sh',
  78.                 '-c',
  79.                 cmd]
  80.         
  81.         for i in xrange(3, MAXFD):
  82.             
  83.             try:
  84.                 os.close(i)
  85.             continue
  86.             except OSError:
  87.                 continue
  88.             
  89.  
  90.         
  91.         
  92.         try:
  93.             os.execvp(cmd[0], cmd)
  94.         finally:
  95.             os._exit(1)
  96.  
  97.  
  98.     
  99.     def poll(self, _deadstate = None):
  100.         if self.sts < 0:
  101.             
  102.             try:
  103.                 (pid, sts) = os.waitpid(self.pid, os.WNOHANG)
  104.                 if pid == self.pid:
  105.                     self.sts = sts
  106.             except os.error:
  107.                 if _deadstate is not None:
  108.                     self.sts = _deadstate
  109.                 
  110.             except:
  111.                 _deadstate is not None
  112.             
  113.  
  114.         None<EXCEPTION MATCH>os.error
  115.         return self.sts
  116.  
  117.     
  118.     def wait(self):
  119.         if self.sts < 0:
  120.             (pid, sts) = os.waitpid(self.pid, 0)
  121.             self.sts = sts
  122.         
  123.         return self.sts
  124.  
  125.  
  126.  
  127. class Popen4(Popen3):
  128.     childerr = None
  129.     
  130.     def __init__(self, cmd, bufsize = -1):
  131.         _cleanup()
  132.         self.cmd = cmd
  133.         (p2cread, p2cwrite) = os.pipe()
  134.         (c2pread, c2pwrite) = os.pipe()
  135.         self.pid = os.fork()
  136.         if self.pid == 0:
  137.             os.dup2(p2cread, 0)
  138.             os.dup2(c2pwrite, 1)
  139.             os.dup2(c2pwrite, 2)
  140.             self._run_child(cmd)
  141.         
  142.         os.close(p2cread)
  143.         self.tochild = os.fdopen(p2cwrite, 'w', bufsize)
  144.         os.close(c2pwrite)
  145.         self.fromchild = os.fdopen(c2pread, 'r', bufsize)
  146.  
  147.  
  148. if sys.platform[:3] == 'win' or sys.platform == 'os2emx':
  149.     del Popen3
  150.     del Popen4
  151.     
  152.     def popen2(cmd, bufsize = -1, mode = 't'):
  153.         (w, r) = os.popen2(cmd, mode, bufsize)
  154.         return (r, w)
  155.  
  156.     
  157.     def popen3(cmd, bufsize = -1, mode = 't'):
  158.         (w, r, e) = os.popen3(cmd, mode, bufsize)
  159.         return (r, w, e)
  160.  
  161.     
  162.     def popen4(cmd, bufsize = -1, mode = 't'):
  163.         (w, r) = os.popen4(cmd, mode, bufsize)
  164.         return (r, w)
  165.  
  166. else:
  167.     
  168.     def popen2(cmd, bufsize = -1, mode = 't'):
  169.         inst = Popen3(cmd, False, bufsize)
  170.         return (inst.fromchild, inst.tochild)
  171.  
  172.     
  173.     def popen3(cmd, bufsize = -1, mode = 't'):
  174.         inst = Popen3(cmd, True, bufsize)
  175.         return (inst.fromchild, inst.tochild, inst.childerr)
  176.  
  177.     
  178.     def popen4(cmd, bufsize = -1, mode = 't'):
  179.         inst = Popen4(cmd, bufsize)
  180.         return (inst.fromchild, inst.tochild)
  181.  
  182.     __all__.extend([
  183.         'Popen3',
  184.         'Popen4'])
  185.  
  186. def _test():
  187.     _cleanup()
  188.     cmd = 'cat'
  189.     teststr = 'ab cd\n'
  190.     if os.name == 'nt':
  191.         cmd = 'more'
  192.     
  193.     expected = teststr.strip()
  194.     print 'testing popen2...'
  195.     (r, w) = popen2(cmd)
  196.     w.write(teststr)
  197.     w.close()
  198.     got = r.read()
  199.     if got.strip() != expected:
  200.         raise ValueError('wrote %r read %r' % (teststr, got))
  201.     
  202.     print 'testing popen3...'
  203.     
  204.     try:
  205.         (r, w, e) = popen3([
  206.             cmd])
  207.     except:
  208.         (r, w, e) = popen3(cmd)
  209.  
  210.     w.write(teststr)
  211.     w.close()
  212.     got = r.read()
  213.     if got.strip() != expected:
  214.         raise ValueError('wrote %r read %r' % (teststr, got))
  215.     
  216.     got = e.read()
  217.     if got:
  218.         raise ValueError('unexpected %r on stderr' % (got,))
  219.     
  220.     for inst in _active[:]:
  221.         inst.wait()
  222.     
  223.     _cleanup()
  224.     if _active:
  225.         raise ValueError('_active not empty')
  226.     
  227.     print 'All OK'
  228.  
  229. if __name__ == '__main__':
  230.     _test()
  231.  
  232.